package com.hxd.tabactivityfragment.mvp.presenter

import com.hxd.tabactivityfragment.bean.UserBean
import com.hxd.tabactivityfragment.mvp.base.IBasePresenter
import com.hxd.tabactivityfragment.mvp.model.LoginModel
import com.hxd.tabactivityfragment.mvp.view.ILoginView

/**
 *  项目名：    FoodOrigins
 *  包名：      com.hxd.tabactivityfragment.mvp.presenter
 *  文件名:     LoginPresenter
 *  创建者:     HXD
 *  创建时间:   2019/3/30 21:31
 *  描述:       TODO
 */


/**
 * mvp中Presenter中的设计
 * 也是比较难，需要重点理解的一个
 * presenter是主持人的意思，view和model的中间者
 * 需要同时要有View的对象和Model的对象！一般做法是：在构造方法中创建model对象，并创建一个方法绑定View接口
 * 这里可以发现数据处理后或者逻辑判断完后都是给mvp中的View对象来做操作的！
 */
class LoginPresenter: IBasePresenter {



    /**
     * 登录业务实现者，数据处理的操作者
     */
    private val mLoginModel by lazy { LoginModel() }

    /**
     * 视图接口对象
     */
    private var mLoginView: ILoginView? = null

    /**
     * 登录业务
     */
    fun login() {
        val account = mLoginView!!.getAccount()
        val password = mLoginView!!.getPassword()
        if (checkParameter(account, password)) {
            doSomePrepare()
            //登录 ，需要处理数据，所有要在model中执行
            mLoginModel!!.login(account, password, object : LoginModel.OnLoginResultListener {
                override fun loginSuccess(user: UserBean, result: String) {
                    mLoginView!!.loginSuccess(user, result)
                }

                override fun loginFailure(msg: String) {
                    mLoginView!!.getDataFail(msg)
                }
            })
        }
    }

    /**
     * 记住密码
     */
    fun initRemPsw(){
        mLoginView!!.rememberPassword()
    }

    /**
     * 做一些准备
     */
    private fun doSomePrepare() {
        //这里可以设置按钮不可点击！否则一直点击登录也是不好
    }

    /**
     * 检测参数是否是否为空~~~
     *
     * @param account
     * @param password
     * @return
     */
    private fun checkParameter(account: String, password: String): Boolean {
        if (!account.isNotEmpty() || !password.isNotEmpty()) {
            //提示错误
            mLoginView?.getDataFail("账号密码为空")
            return false
        } else if (!checkNetwork()) {
            //提示网络错误
            mLoginView?.showNetworkError()
            return false
        }
        return true
    }

    /**
     * 检测网络是否可用
     */
    private fun checkNetwork(): Boolean {
        return true//先显示可以联网，实际中要用代码判断
    }

    /**
     * 绑定View方法
     */
    override fun bindView(view: Any) {
        mLoginView = view as ILoginView
    }

    /**
     * 解绑View方法
     */
    override fun destoryView() {
        if (mLoginView != null) {
            mLoginView = null
        }
    }

}